using System;
using System.Collections.Generic;
using System.Text;
using System.Data;

namespace SistemaLib.sipe.util.io
{
    

    public class ExportadorDataSetToString
    {

        DataSet[] _ds;
		ExportadorDataSetColumna[] _columnas;
        EscribidorDeStrings _cadena = new EscribidorDeStrings();
		bool _noCerrar = false;
		FormatosFechas _formatoFecha = FormatosFechas.Fecha;
		string _cabecera = "";
		TipoArchivoExportadorDataset _tipo = TipoArchivoExportadorDataset.TXT;

		public ExportadorDataSetToString()
		{
			
		}

		public ExportadorDataSetToString( DataSet ds)
		{
			this.DatosOrigen = new DataSet[1];
			this.DatosOrigen[0] = ds;
		}

        public ExportadorDataSetToString(DataSet[] dss)
		{
			this.DatosOrigen = dss;
		}

		public DataSet[] DatosOrigen
		{
			get
			{ return _ds; }
			set
			{ _ds = value; }
		}

		public FormatosFechas FormatoFechas
		{
			set
			{ _formatoFecha = value; }
		}

		public bool NoCerrar
		{
			get
			{ return _noCerrar; }
			set
			{ _noCerrar = value; }
		}

		public string Cabecera
		{
			set
			{
				this._cabecera = value;
			}
		}

		public TipoArchivoExportadorDataset Tipo
		{
			set
			{
				_tipo = value;
			}
		}
        
        public override string ToString()
        {
            return _cadena.ToString();
        }

		public string Generar()
		{

			if ( _tipo == TipoArchivoExportadorDataset.TXT )
			{
				_cadena.Separador = Convert.ToChar(9);
                _cadena.EscapearEnter = true;
			}

			if ( _tipo == TipoArchivoExportadorDataset.CVS )
			{
                _cadena.Separador = ';';
                _cadena.EscapearEnter = true;
			}

			
			if ( this._cabecera != "" )
			{
                _cadena.ImprimirColumna(this._cabecera);
                _cadena.ImprimirFinLinea();
			}

			for ( int idx = 0; idx < _ds.Length; idx++)
			{

				DataTable tabla = _ds[idx].Tables[0];

				if ( _columnas == null )
				{
					// Imprimo cabecera
					for( int i = 0; i < tabla.Columns.Count; i++)
					{
						string nombre = tabla.Columns[i].Caption;
						_cadena.ImprimirColumna( nombre);
					}
                    _cadena.ImprimirFinLinea();

					// Imprimo las lineas
					for( int j = 0; j < tabla.Rows.Count; j++)
					{
						for( int i = 0; i < tabla.Columns.Count; i++)
						{
							string valor;
							System.Type tipo = tabla.Rows[j][i].GetType();
							if ( tipo.Name == "String" )
							{
								valor = "\"" + tabla.Rows[j][i].ToString() + "\"";
							}
							else if ( tipo.Name == "DateTime"  )
							{
								string formato = "";
								if ( _formatoFecha == FormatosFechas.Fecha )
									formato = "dd/MM/yyyy";
								else
									formato = "dd/MM/yyyy HH:mm";
								
								//CultureInfo ci = new CultureInfo( );
								valor = DateTime.Parse( tabla.Rows[j][i].ToString()).ToString( formato);

							} 
							else if ( tipo.Name == "Decimal" )
							{
								try 
								{
									valor = Func.DecimalToCadena( (decimal)tabla.Rows[j][i]);
								} 
								catch ( Exception )
								{ valor = tabla.Rows[j][i].ToString() ; }
							}
							else
							{
								valor = tabla.Rows[j][i].ToString();
							}
                            _cadena.ImprimirColumna(valor);
						}
                        _cadena.ImprimirFinLinea();
					}
				}
				else
				{
					// Imprimo cabecera
					for( int i = 0; i < _columnas.Length; i++)
					{
						string nombre = "";
						if ( _columnas[i].NombreExportado == "" )
							nombre = tabla.Columns[_columnas[i].NombreOriginal].Caption;
						else
							nombre = _columnas[i].NombreExportado;
                        _cadena.ImprimirColumna(nombre);
					}
                    _cadena.ImprimirFinLinea();

					// Imprimo las lineas
					for( int j = 0; j < tabla.Rows.Count; j++)
					{
						for( int i = 0; i < _columnas.Length; i++)
						{
							string valor;
							System.Type tipo = tabla.Rows[j][_columnas[i].NombreOriginal].GetType();
							if ( tipo.Name == "String" )
							{
								valor = "\"" + tabla.Rows[j][_columnas[i].NombreOriginal].ToString() + "\"";
							}
							else if ( tipo.Name == "DateTime"  )
							{
								//CultureInfo ci = new CultureInfo( "es-AR");
								string formato = "";
								if ( _formatoFecha == FormatosFechas.Fecha )
									formato = "dd/MM/yyyy";
								else
									formato = "dd/MM/yyyy HH:mm";
									
								valor = DateTime.Parse( tabla.Rows[j][_columnas[i].NombreOriginal].ToString()).ToString( formato);
							}  
							else if ( tipo.Name == "Decimal" )
							{
								try 
								{
									valor = Func.DecimalToCadena( (decimal)tabla.Rows[j][_columnas[i].NombreOriginal]);
								} 
								catch ( Exception )
								{ valor = tabla.Rows[j][i].ToString() ; }
							}
							else
							{
								valor = tabla.Rows[j][_columnas[i].NombreOriginal].ToString();
							}
                            _cadena.ImprimirColumna(valor);
						}
                        _cadena.ImprimirFinLinea();
					}
				}

			
			
			}

            return _cadena.ToString();

		}

    }
}
